package it.clem.little.domain.terreno;

import it.clem.little.domain.ArmorType;
import it.clem.little.domain.AttackType;
import it.clem.little.domain.BuildCost;
import it.clem.little.domain.UnitSize;
import it.clem.little.domain.units.IUnit;

public abstract class UnitaSchierata implements IUnitaSchierata{
  private final IUnit unita;
  private final boolean amica;
  private final Posizione posizione;
  private double percentualeSlow=0;
  private double percentualeHaste=0;
  
  /**
   * 
   * @param unita
   * @param amica
   * @param riga
   * @param fila 1 e' la fila di attacco
   */
  public UnitaSchierata(IUnit unita,boolean amica,int riga, int fila) {
    super();
    this.unita = unita;
    this.posizione= new Posizione(riga, (amica ? 8-fila:fila+8)*2);
    this.amica=amica;
  }
  
  public void avanza(int quantita) {
    posizione.avanza(quantita,amica);
  }

  public int getCol() {
    return posizione.getCol();
  }

  public int getRow() {
    return posizione.getRow();
  }


  public boolean isAmica() {
    return amica;
  }

  public String getName() {
    return unita.getName();
  }

  public ArmorType getArmorType() {
    return unita.getArmorType();
  }

  public AttackType getAttackType() {
    return unita.getAttackType();
  }

  public int getInitialHP() {
    return unita.getInitialHP();
  }

  public int getCurrentHP() {
    return unita.getCurrentHP();
  }

  public int getArmorPoints() {
    return unita.getArmorPoints();
  }

  public int getAttackPoints() {
    return unita.getAttackPoints();
  }

  public int getRange() {
    return unita.getRange();
  }

  public BuildCost getBuildCost() {
    return unita.getBuildCost();
  }

  public int getPopulation() {
    return unita.getPopulation();
  }

  public UnitSize getSize() {
    return unita.getSize();
  }

  public boolean isDead() {
    return unita.isDead();
  }

  public void addHP(int hp) {
    unita.addHP(hp);
  }

  public void subtractHP(int hp) {
    unita.subtractHP(hp);
  }

  public boolean isNonCombatant() {
    return unita.isNonCombatant();
  }

  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + (amica ? 1231 : 1237);
    result = prime * result + ((posizione == null) ? 0 : posizione.hashCode());
    result = prime * result + ((unita == null) ? 0 : unita.hashCode());
    return result;
  }

  @Override
  public boolean equals(Object obj) {
    if (this == obj)
      return true;
    if (obj == null)
      return false;
    if (getClass() != obj.getClass())
      return false;
    UnitaSchierata other = (UnitaSchierata) obj;
    if (amica != other.amica)
      return false;
    if (posizione == null) {
      if (other.posizione != null)
        return false;
    } else if (!posizione.equals(other.posizione))
      return false;
    if (unita == null) {
      if (other.unita != null)
        return false;
    } else if (!unita.equals(other.unita))
      return false;
    return true;
  }

  @Override
  public void slow(double percentuale) {
    this.percentualeSlow=percentuale;
  }

  @Override
  public void haste(double percentuale) {
    this.percentualeHaste=percentuale;
  }

  @Override
  public void resetEffetti() {
    this.percentualeHaste=0;
    this.percentualeSlow=0;
  }

  public double getPercentualeSlow() {
    return percentualeSlow;
  }

  public double getPercentualeHaste() {
    return percentualeHaste;
  }


}